/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pessoas.collection;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import pessoas.interfaces.IObservadorContatos;
import pessoas.log.ConfiguracoesLog;
import pessoas.model.Contato;
import pessoas.dao.FacadeDao;

/**
 *
 * @author Bush
 */
public class Contatos {

    private ArrayList<Contato> contatos;
    private ConfiguracoesLog configLog;
    private static Contatos instancia;
    private ArrayList<IObservadorContatos> observadores;

    private Contatos() throws FileNotFoundException {        
        contatos = new ArrayList<Contato>();      
        observadores = new ArrayList<IObservadorContatos>();
        carregaContatos();
    }
    
    public static Contatos getInstancia() throws FileNotFoundException{
        if(instancia == null){
            instancia = new Contatos();
        }
        return instancia;
    }
    
    public int quantidadeContatosUf(Contatos contatos, String oper, String uf){
        int quantidade = 0;    
        for(int i=0;i<contatos.getContatos().size();i++){
                if(contatos.getContatos().get(i).getOperadora().equals(oper) &&
                        contatos.getContatos().get(i).getUf().equals(uf)){
                    quantidade++;
                }
            }
        return quantidade;
    }

    public void carregaContatos() throws FileNotFoundException {
        contatos = FacadeDao.getInstancia().lerContatos();
    }
    
    public boolean verificaContatoArray(ArrayList<Contato> c, Contato contato) {
        int cont = 0;
        for (int i = 0; i < c.size(); i++) {
            if (c.get(i).getTelefone().equals(contato.getTelefone())) {
                cont++;
            }
        }
        if(cont == 1)
            return false;
        else
            return true;
    }

    public boolean verificaContato(Contato contato) {
        for (int i = 0; i < contatos.size(); i++) {
            if (contatos.get(i).getTelefone().equals(contato.getTelefone())) {
                return true;
            }
        }
        return false;
    }

    public void addContatoArrayList(ArrayList<Contato> listaXML) throws Exception {
        try {
            for (int i = 0; i < listaXML.size(); i++) {
                salvarContato(listaXML.get(i));
            }
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
        notificar();
    }

    public void excluirContato(Contato c) throws Exception {
        for (int i = 0; i < contatos.size(); i++) {
            if (contatos.get(i).getNome().equals(c.getNome())
                    && contatos.get(i).getTelefone().equals(c.getTelefone())) {
                contatos.remove(i);
                FacadeDao.getInstancia().liparGravarContatos(contatos);
            }
        }
        notificar();
    }

    public void editarContato(Contato c, Contato cont) throws Exception {
        for (int i = 0; i < contatos.size(); i++) {
            if (contatos.get(i).getNome().equals(c.getNome())
                    && contatos.get(i).getTelefone().equals(c.getTelefone())) {
                contatos.set(i, cont);
                FacadeDao.getInstancia().liparGravarContatos(contatos);
            }
        }
        notificar();
    }
    
    public void setContato(Contato c,int i) throws FileNotFoundException{
        contatos.set(i, c);
        notificar();
    }

    public void salvarContato(Contato c) throws IOException, Exception {
        contatos.add(c);
        FacadeDao.getInstancia().gravarContato(c);   
        notificar();
    }
    
    public void gravarLog(String log) throws IllegalAccessException, InstantiationException, ClassNotFoundException, IOException{       
        ConfiguracoesLog.getInstancia().getLog().gravarLog(log);
    }
    
    public void setArrayListContato(ArrayList<Contato> contatos){
        this.contatos = contatos;
    }

    public ArrayList<Contato> getContatos() {
        return contatos;
    }
    
//------------------------------Padrão Observer--------------------------------------
    
    public void cadastrarObservador(IObservadorContatos observador){
        observadores.add(observador);
    }
    
    public void removerObservador(IObservadorContatos observador){
        observadores.remove(observador);
    }
    
    public void notificar() throws FileNotFoundException{
        for(int i=0; i<observadores.size(); i++){
            observadores.get(i).atualizar(getInstancia());
        }
    }

}
